'''
Created on 29/04/2013

@author: belentwi
'''
from flask import Blueprint
from flask import request
from flask import render_template
from flask import flash
from flask import redirect
from flask import url_for

from app.models.atributo import Atributo
from app.wtforms.atributo_forms import AtributoBuscar
from app.wtforms.atributo_forms import AtributoEditable
from app.wtforms.atributo_forms import AtributoNoEditable

from app.security import permission


from app import db

mod = Blueprint('atributos', __name__, url_prefix='/atributo')


@mod.route('/administracion/', methods=['GET', 'POST'])
@permission('ADMINISTRACION_ATRIBUTOS')
def administracion_atributo():
    """
    Muestra en pantalla los atributos que existen en la base de datos.
    @param filtros: los filtros segun los cuales se mostraran los atributos.
    @return: listado de los atributos segun los filtros indicados  
    """
   
    form =  AtributoBuscar(request.form)
        
    nombreFilter = form.nombre.data
    tipoFilter = form.tipo.data
    descripcionFilter = form.descripcion.data    
    
    
    if(nombreFilter == None):
        nombreFilter = ''
    
    if(tipoFilter == None):
        tipoFilter = ''
        
    if(descripcionFilter == None):
        descripcionFilter = ''
       
        
    atributos = Atributo.query.filter(Atributo.nombre.like( '%'+nombreFilter+'%' ),  Atributo.tipo.like( '%'+tipoFilter+'%' ), Atributo.descripcion.like('%'+descripcionFilter+'%'))
    atributos.all()
    
    
    return render_template('atributo/administracion_atributo.html', form = form, atributos = atributos)



@mod.route('/crear/', methods=['GET', 'POST'])
@permission('CREAR_ATRIBUTO')
def crear_atributo():
    """
    Muestra en pantalla el formulario de creacion de atributos, valida los datos ingresados por
    el usuario, hace las validaciones de que el nombre del nuevo atributo no exista en el
    sistema y se hayan ingresado los datos obligatorios. Luego almacena en base de datos
    """
    choicesTipos = (('1', 'String'), ('2', 'Integer'),  ('3', 'Date'),)
    # Obtenemos el formulario
    form = AtributoEditable(request.form)  
    form.tipo.choices = choicesTipos
    
    # Obtenemos todos los atributos existentes en la base de datos
    atributos = Atributo.query.all()
   
    if form.validate_on_submit():
        
        contN=0
        for atributo in atributos:
            if atributo.nombre == form.nombre.data:
                contN = contN + 1
         
        if contN != 0:
            flash("El nombre del atributo ya existe, elija otro", 'error-message')
            # Redirigimos a la pagina de modificacion
            return redirect(url_for('atributos.crear_atributo'))       
        else:
        
            nombre = form.nombre.data
            posicion = int(form.tipo.data)-1
        
            tipo = choicesTipos[posicion][1]  
            descripcion = form.descripcion.data
              
            atributo = Atributo(nombre, tipo, descripcion)
            
       
            
            db.session.add(atributo)
            db.session.commit()
            
            flash('El atributo ha sido registrado con exito')
            return redirect(url_for('atributos.administracion_atributo'))

    return render_template("atributo/crear_atributo.html", form=form)



@mod.route('/eliminar/<atributo>/', methods=['GET', 'POST'])
@permission('ELIMINAR_ATRIBUTO')
def eliminar_atributo(atributo):
    """
        Muestra en pantalla el formulario de eliminacion de atributos, se pide la confimacion del usuario 
        y se elimina el atributo.
        
        @param atributo: id del atributo que se desea eliminar.
    """

   
    atributo_seleccionado = Atributo.query.filter_by(id=atributo).first()
    
    db.session.delete(atributo_seleccionado)
    db.session.commit()
    flash('Se ha eliminado el atributo exitosamente')
 
            
    return redirect(url_for('atributos.administracion_atributo'))



@mod.route('/modificar/<atributo>/', methods=['GET', 'POST'])
@permission('MODIFICAR_ATRIBUTO')
def modificar_atributo(atributo):
    """
        Muestra en pantalla el formulario de modificacion de atributos, se modifcan los campos requeridos y se guardan los cambios
        
        @param atributo: id del atributo que se desea modificar.
    """

   
    atributo_seleccionado = Atributo.query.filter_by(id=atributo).first()
    form = AtributoNoEditable(request.form)  
    form.nombre.data = atributo_seleccionado.nombre
    form.tipo.data = atributo_seleccionado.tipo
    
    if form.validate_on_submit():
        
        descripcion = form.descripcion.data
        atributo_seleccionado.descripcion = descripcion
        
        
   
        
        db.session.add(atributo_seleccionado)
        db.session.commit()
        
        flash('El atributo ha sido modificado con exito')
        return redirect(url_for('atributos.administracion_atributo'))
    
    form.descripcion.data = atributo_seleccionado.descripcion
    
            
    return render_template("atributo/modificar_atributo.html", form=form)


@mod.route('/consultar/<atributo>/', methods=['GET', 'POST'])
@permission('CONSULTAR_ATRIBUTO')
def consultar_atributo(atributo):
    """
        Muestra en pantalla los datos de un atributo
        
        @param atributo: id del atributo que se desea consultado.
    """

   
    atributo_seleccionado = Atributo.query.filter_by(id=atributo).first()
    form = AtributoNoEditable(request.form) 
     
    form.nombre.data = atributo_seleccionado.nombre
    form.tipo.data = atributo_seleccionado.tipo
    form.descripcion.data = atributo_seleccionado.descripcion
    
    
    
            
    return render_template("atributo/consultar_atributo.html", form=form)